﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using FinanSoft.BusinessLayer;
using System.Runtime.Serialization;
using System.Drawing;

namespace FinanSoft.Entities
{
    [DataContract]
    public class Item
    {

        #region Atributos
        private int _id;
        private String _codArticulo;
        private String _descripcion;
        private int _id_Unidad_Medida;
        private String _comentario;
        private byte[] _imagen;
        // Lista de la información de un artículo en cada bodega, está indexado por Id de la bodega
        private Dictionary<int, ItemStoreRoomInfo> _storeRoomInfo;
        #endregion

        #region Properties
        // Para el id
        [DataMember]
        public int Id
        {
            get
            {
                return _id;
            }
            set
            {
                _id = value;
            }
        }
        // Parala imagen
        [DataMember]
        public byte[] imagen
        {
            get
            {
                return _imagen;
            }
            set
            {
                _imagen = value;
            }
        }
        // Para el código del Artículo
        [DataMember]
        public String CodArticulo
        {
            get
            {
                return _codArticulo;
            }
            set
            {
                _codArticulo = value;
            }
        }

        //Para la descripcion
        [DataMember]
        public String Descripción
        {
            get
            {
                return _descripcion;
            }
            set
            {
                _descripcion = value;
            }
        }

        // Para el id de la Unidad Media
        public int UnidadMedida
        {
            get
            {
                return _id_Unidad_Medida;
            }
            set
            {
                _id_Unidad_Medida = value;
            }
        }

        [DataMember]
        public string MeasureAcronim
        {
            get
            {
                return ItemManager.GetInstance().GetMeasurementUnit(_id_Unidad_Medida).acronimo;
            }
            set
            {
            }
        }

        //Para el comentario
        [DataMember]
        public String Comentario
        {
            get
            {
                return _comentario;
            }
            set
            {
                _comentario = value;
            }
        }

        [DataMember]
        public ItemStoreRoomInfo[] StoreInfo
        {
            get
            {
                return _storeRoomInfo.Values.ToArray();
            }
            set
            {
                _storeRoomInfo = new Dictionary<int, ItemStoreRoomInfo>();
                _storeRoomInfo.Clear();
                foreach (ItemStoreRoomInfo store in value)
                    _storeRoomInfo.Add(store.StoreRoom.Id, store);
            }
        }

        #endregion

        #region Constructor
        /// <summary>
        /// Método Constructor
        /// </summary>
        /// <param name="codArticulo"></param>
        /// <param name="descripcion"></param>
        /// <param name="idUnidadMedia"></param>
        /// <param name="comentario"></param>
        public Item(int id, String codArticulo, String descripcion, int idUnidadMedida, String comentario, List<ItemStoreRoomInfo> info)
        {
            _id = id;
            _codArticulo = codArticulo;
            _descripcion = descripcion;
            _id_Unidad_Medida = idUnidadMedida;
            _comentario = comentario;
            _storeRoomInfo = new Dictionary<int, ItemStoreRoomInfo>();
            foreach (ItemStoreRoomInfo roomInfo in info)
                _storeRoomInfo.Add(roomInfo.StoreRoom.Id, roomInfo);
        }

        /// <summary>
        /// Sin id para inserciones
        /// </summary>
        /// <param name="codArticulo"></param>
        /// <param name="descripcion"></param>
        /// <param name="idUnidadMedida"></param>
        /// <param name="comentario"></param>
        public Item(String codArticulo, String descripcion, int idUnidadMedida, String comentario)
        {
            _codArticulo = codArticulo;
            _descripcion = descripcion;
            _id_Unidad_Medida = idUnidadMedida;
            _comentario = comentario;
            List<StoreRoom> stRooms = StoreRoomManager.GetInstance().GetStoreRooms();
            _storeRoomInfo = new Dictionary<int, ItemStoreRoomInfo>();
            foreach(StoreRoom room in stRooms)
                _storeRoomInfo.Add(room.Id, new ItemStoreRoomInfo(room.Id, room.InventoryAccount.AccountID, room.SalesCostAccount.AccountID, room.SalesAccount.AccountID, room.PurchasesAccount.AccountID));
        }

        /// <summary>
        /// Solo id e imagen para las imagenes por articulo
        /// </summary>
        /// <param name="codArticulo"></param>
        /// <param name="descripcion"></param>
        /// <param name="idUnidadMedida"></param>
        /// <param name="comentario"></param>
        public Item(int idFotoArt, byte[] itemImagen)
        {
            _id = idFotoArt;
            _imagen = itemImagen;            
        }
        #endregion

        #region Methods
        /// <summary>
        ///  Devuelve la información de un artículo para una bodega en específico
        /// </summary>
        /// <param name="storeRoomId"></param>
        /// <returns></returns>
        public ItemStoreRoomInfo GetStoreRoomInfo(int storeRoomId)
        {
            if(_storeRoomInfo.ContainsKey(storeRoomId))
                return _storeRoomInfo[storeRoomId];
            return null;
        }

        public void AddNewStoreRoom(StoreRoom newStore)
        {
            if(!_storeRoomInfo.ContainsKey(newStore.Id))
                _storeRoomInfo.Add(newStore.Id, new ItemStoreRoomInfo(newStore.Id, newStore.InventoryAccount.AccountID, newStore.SalesCostAccount.AccountID, newStore.SalesAccount.AccountID, newStore.PurchasesAccount.AccountID));
        }

        #endregion

    }
}
